package myjava.enumerated;

public class Root1 {

   public static void main(String[] args) {

      new TellMeAboutIt(Season.WINTER).talk();
      new TellMeAboutIt(Season.SPRING).talk();
      new TellMeAboutIt(Season.SUMMER).talk();
      new TellMeAboutIt(Season.FALL).talk();

      for (Season p : Season.values()) {
         System.out.println(p);
      }

      new Foo().printSeasons();

      // chiaramente, essendo Season static lo puoi accedere dal nome di classe
      Foo.Season x = Foo.Season.FELL;

   }
}

/* enum is a class which extends java.lang.Enum e da questa eredita values()

   -- appena dichiari le costanti essi diventano istanza della classe enum stessa
   -- tali istanze sono attributi statici della classe enum
   -- la enum stessa (quando definita nella classe e' statica)
 */

enum Season {
   WINTER,
   SPRING,
   SUMMER,
   FALL
}

class TellMeAboutIt {

   // a value in the enum is instance of the enum itself
   private Season seas;

   // using enums we can make sure s is gonna be one of the expected case conained in  enums
   public TellMeAboutIt(Season s) {

      this.seas = s;
   }

   public void talk() {

      switch (this.seas) {
         case WINTER:
            System.out.println("It's shit man! Too fucking cold!");
            break;
         case SPRING:
            System.out.println("Yeah not toobad chicks start to undress");
            break;
         case SUMMER:
            System.out.println("Summer in Paname!");
            break;
         case FALL:
            System.out.println("It gets me a bit blue but hey?!");
            break;
         default:
            break;
      }
   }
}

class Foo {

   // qui c'e' uno "static" implicito
   public enum Season {
      ZINTER,
      SPRINF,
      SUBBER,
      FELL
   }

   // i metodi pescano in locale per la definizione delle enums
   public void printSeasons() {

      // inoltre ogni valore nell'enum e' istanza dell'enum stessa
      // nota come Sason possa essere acceduto staticamente e non dinamicamente
      // Foo.Season funziona mentre this.Season no!
      for (Season p : Season.values()) {
         System.out.println(p + " e' istanza di Season? " + (p instanceof Season));
      }
   }   
}